Hi,大家好,昨天我們完成了詳細資料頁面的顯示功能,今天開始要進入客服單輸入的功能,要執行這個功能,有幾個機制要先做出來,首先為了知道是誰留下的客服詢問資訊,或是後續的辦理流程,我們的第一步就是要取得使用者資訊,若是還沒有登入者,就要先導向至登入表單,要求使用者進行帳號密碼驗證,這邊我們先以最簡單的帳號密碼機制來進行認證。
所謂的後端session,通常是jsp、asp.net等後端程式,將資料存在伺服器上的機制,通常的狀況是主機發現這個連線是第一次進來時,會給予client一組 session id,完成系統登入後,session中會有使用者的登入資訊,用以識別這個連線已經進來過了,session會在瀏覽器關閉時清除掉,所以這就是常見的關閉瀏覽器,就要重新登入的狀況。
node.js 亦有自己的 session 處理機制,可以讓我們簡單的來使用,但是預設是沒有掛載該功能的,因此我們必須先引用進來,動作如下
var express = require('express');
//加入引用 express-session 套件機制
var session = require('express-session')
//以下省略…
var app = express();
//加入宣告使用session之程式碼
app.use(session({
secret: 'safmgr',
resave: true,
saveUninitialized: true,
cookie: { secure: true, maxAge: 30 * 60 * 1000 }
}))
說明:
secret用來產出session ID的hash 之用,可自由指定
maxAge 為 session 的閒置時間限制,單位為毫秒,所以上面的範例是 30 分鐘
打開系統主功能之 router(routers/saf.js),加入登入表單與登錄處理的 router 設定
/**
* 內部使用者登入頁面
*/
router.get("/loginform", (req, res, next) => {
//若已登入,則直接導向至已登入人員之首頁
if(req.session.user) {
res.redirect("/saf/mgr")
}
res.render("loginform", {
breads: createBreadcrumb("系統登入")
})
})
/**
* 系統登入
*/
router.post("/login", async (req, res, next) => {
try {
let uid = req.body.uid
let pwd = req.body.pwd
//系統帳號驗證
let userinfo = await userdao.chkuser(uid, pwd)
if(!userinfo) {
res.status(500).send("登入失敗")
} else {
//通過驗證,寫入session
req.session.user = userinfo
res.redirect("/saf/mgr")
}
} catch(err) {
res.status(500).send(err.message || err)
}
})
說明:
功能很單純,首先/loginform就是純粹的render,最剛開始的 session 驗證可加可不加,我自己是會加上去,讓已經完成登入的使用者不用再輸一次帳號密碼。/login 則是接收表單送過來給資料庫驗證後,通過驗證時就將使用者資訊放到 session 中,然後進行頁面重導的動作
最後一步是要進行管制區的管制動作,為了避免有人直接繞過系統登入頁,沒有完成登入之連線若是進入管制區,需強制登入,之前我們將管制區的router設定為 /saf/mgr,因此要針對 /routers/mgr.js進行調整,打開/routers/mgr.js,輸入
router.all("/*", (req, res, next) => {
if(!req.session.user) {
res.redirect("/saf")
}
next()
})
說明:進入 mgr中的任何網址,都會先檢查是不是有 session.user,若沒有則一律回到系統首頁,否則執行 next 繼續動作
今天先完成 session 的管制區作業與系統登入之功能,登入之表單可以拿 bootstraps 的範例下來改,因此不另外貼出來了,目前這個版本是單純的帳密檢核,算是第一版,明天預計會按照常見的資安要求,強化使用者驗證的機制,那麼,我們明天再繼續吧